#include "TCP_Server.h"
#define SQLITE_ENABLE_FTS5 1
#include "Sqlite.h"
#include "STM32.h"

// 全局变量定义
int server_sock = 0;                                     // 服务器监听套接字
Client clients[MAX_CLIENTS] = {0};                       // 客户端最大连接数
int client_count = 0;                                    // 客户端连接数量
pthread_mutex_t client_lock = PTHREAD_MUTEX_INITIALIZER; // 客户端初始化一个静态分配的互斥锁

// 初始化TCP服务器
void TCP_Server_Init(int port)
{
    server_sock = socket(AF_INET, SOCK_STREAM, 0); // 创建TCP套接字（IPv4协议，流式套接字）
    if (server_sock == -1)
    {
        perror("套接字创建失败");
        exit(EXIT_FAILURE);
    }

    // 配置服务器地址结构
    struct sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;         // IPv4
    server_addr.sin_addr.s_addr = INADDR_ANY; // 监听所有网卡
    server_addr.sin_port = htons(port);       // 端口号转换为网络字节序

    // 绑定套接字与地址
    if (bind(server_sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1)
    {
        perror("绑定失败");
        close(server_sock);
        exit(EXIT_FAILURE);
    }

    // 开始监听连接（最大等待队列长度为MAX_CLIENTS）
    if (listen(server_sock, MAX_CLIENTS) == -1)
    {
        perror("监听失败");
        close(server_sock);
        exit(EXIT_FAILURE);
    }

    printf("服务器启动成功，端口: %d\n", port);
}

// 接受客户端连接
int TCP_Accept_Client()
{
    struct sockaddr_in client_addr;
    socklen_t client_addr_len = sizeof(client_addr);

    // 阻塞等待客户端连接
    int client_sock = accept(server_sock, (struct sockaddr *)&client_addr, &client_addr_len);
    if (client_sock == -1)
    {
        perror("接受连接失败");
        return -1;
    }

    // 打印客户端连接信息（IP和端口） inet_ntoa：网络地址转字符串  ntohs：端口号转主机字节序
    printf("客户端连接：%s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
    return client_sock; // return 客户端套接字描述符
}

/**
 * 向指定客户端发送数据
 * @param sock_fd 客户端套接字
 * @param data 要发送的数据
 * @return 实际发送的字节数（失败返回-1）
 */
int TCP_Send_Data(int sock_fd, const char *data)
{
    int len = strlen(data);
    int sent = send(sock_fd, data, len, 0);
    if (sent == -1)
    {
        perror("发送数据失败");
    }
    return sent; // 返回实际发送的字节数
}

/**
 * 从客户端接收数据
 * @param sock_fd 客户端套接字
 * @param buffer 接收缓冲区
 * @return 接收的字节数（失败或断开返回-1）
 */
int TCP_Recv_Data(int sock_fd, char *buffer)
{
    int len = recv(sock_fd, buffer, BUFFER_SIZE - 1, 0);
    if (len <= 0)
    {
        perror("接收失败或客户端断开");
        return -1;
    }
    buffer[len] = '\0';
    return len;
}
